import clr

clr.AddReference('Dll开发')

from MyDLL import *
import os
import re
import requests
import json
import sqlite3



folder = '图片所在的文件夹'
db_name = '.SBT'
error_msg = []


def get_pid_from_folder(folder_path):
    '''
    获取 本地文件夹的文件列表，分析出pid
    :param folder_path: 文件夹路径
    :return:不重复的pid列表
    '''
    pids = set()
    result = os.listdir(folder_path)
    for i in result:
        ex = "^(\d*?)_p\d*?\.\w*$"  # p站图片文件名特征
        temp = re.findall(ex, i)
        if len(temp) == 1:
            pids.add(temp[0])
    return list(pids)

def Clear_not_p_img(m:MySqlite):
    notp=m.Get_Targets_By_Tag("非p站图片")
    if(len(notp)!=0):
        for i in notp:
            print("删除"+i+"的处理结果:"+str(m.Delete_Target_by_Name(i)))

def get_img_info(pid, session, headers):
    """
    获取p站图片的相关信息
    :param pid: p站图片的id
    :param session: 会话对象
    :param headers: 头文件（需含有可用cookie)
    :return: 返回一个二级列表
    [0][0]为作者名 [0][1]为作者id
    [1]中含有各个一级列表：[1][i][0]为标签外文。若有翻译，[1][i][1]为标签翻译
    """
    response_text = session.get('https://www.pixiv.net/ajax/illust/' + str(pid), headers=headers).text

    result = json.loads(response_text)
    if result['error'] is True:  # 处理有错误信息的网页
        temp_str = '错误！！！ https://www.pixiv.net/ajax/illust/' + str(pid) + ' 错误信息：' + result['message']
        print(temp_str)
        error_msg.append(temp_str)
        return None
        # raise BaseException(result['message'])

    # print("作者："+result['body']['userName']+",其ID为："+result['body']['userId'])
    last_author = [result['body']['userName'],
                   result['body']['userId']]  # list indices must be integers or slices, not str

    # print("标签如下：")
    last_tags = []
    for i in result['body']['tags']['tags']:

        if 'translation' in i.keys():  # 判断键是否存在
            # print('翻译：'+i['translation']['en'])
            last_tags.append([i['tag'], i['translation']['en']])
        else:
            last_tags.append([i['tag']])
    result = []
    result.append(last_author)
    result.append(last_tags)
    return result


headers = {
    'cookie': '登录之后的cookie'
}

session = requests.session()

if __name__ == "__main__":
    # 连接数据库
    MyDB = MySqlite();
    MyDB.Create_Open_DB(folder + db_name)
    Clear_not_p_img(MyDB)
    # 获取本地文件列表
    files_name = os.listdir(folder)
    files_name.remove(db_name)  # 移除数据库文件
    files_total=len(files_name)
    print("获取到", files_total, "个对象")
    counter = 0;  # 计数器：在测试阶段用来限制下方循环次数，只爬取少量图片。

    # 分析是否是p站的图片
    for file_name in files_name:
        # 检测是否已存在于数据库中
        print("(%d/%d) %s"%(counter+1,files_total,file_name))
        if MyDB.Target_is_Exist(file_name) == 1 :
            print("已经存在,故跳过")
            counter+=1
            continue
        #ex = "^(\d*?)_p\d*?\.\w*$"  # p站图片文件名特征
        ex = "^(\d*?)(?:|_p\d*?\.\w*)$"  # p站图片文件名特征  "(?:|_p\d*?\.\w*)"这段表示名字中的"_p..."要么为空，要么可有_p...
        temp_pid = re.findall(ex, file_name)
        if len(temp_pid) == 0:  # 如果不是p站图片
            MyDB.Add_Map_Target_Tag(file_name, "非p站图片")
            print(file_name, "不是p张图片，已记录至数据库")
        elif len(temp_pid) == 1:  # 如果是p站图片，则分析出pid，并爬取标签数据
            img_info = get_img_info(temp_pid[0], session, headers)
            if img_info is None:
                counter+=1
                continue
            MyDB.Add_Tag(img_info[0][0], img_info[0][1])  # 添加作者及其id
            MyDB.Add_Map_Target_Tag(file_name, img_info[0][0])  # 添加映射关系：文件名-作者
            MyDB.Add_Map_Tag_Tag("p站作者", img_info[0][0])  # 添加标签的映射关系："p站作者"-作者名
            print("已添加映射关系" + file_name + "--" + img_info[0][0] + "和\"p站作者\"-" + img_info[0][0])
            # 向数据库中添加标签
            print(temp_pid, "标签：", end="")
            for tags in img_info[1]:
                if (len(tags) == 2):  # 如果标签带有翻译
                    MyDB.Add_Tag(tags[1], tags[0])  # 标签本体作为备注，标签翻译作为标签本体进行存储
                    tag_name = tags[1]
                    MyDB.Add_Map_Tag_Tag("标签来自p站", tags[1])
                elif (len(tags) == 1):  # 如果标签没有翻译
                    MyDB.Add_Tag(tags[0], "")
                    tag_name = tags[0]
                else:
                    print(tags, "列表的元素个数不是1或2，不是正常的标签")
                    break;
                MyDB.Add_Map_Target_Tag(file_name, tag_name)  # 添加映射关系：文件名-标签
                MyDB.Add_Map_Tag_Tag("标签来自p站", tag_name)  # 添加标签间的映射关系："标签来自p站"-标签名
                print(" "+tag_name, end="")
            print()
        counter += 1
    MyDB.Close_DB()
    for i in error_msg:
        print(i)
    print("执行完毕")
